/*
 * @Descripttion: 暴露axios主方法
 * @version:
 * @Author: yangzhihao
 * @Date: 2021-07-13 15:07:47
 * @LastEditors: yangzhihao
 * @LastEditTime: 2021-07-14 14:59:20
 */
import { AxiosPromise, AxiosResponse } from '../constant/index'
import { AxiosRequestConfig } from '../constant'
import xhr from '../xhr'
import { buildURL } from '../utils/url'
import { transformRequest, transformResponse } from '../utils/data'
import { processHeaders } from '../utils/header'

export default function dispatchRequest(config: AxiosRequestConfig): AxiosPromise {
  processConfig(config)
  return xhr(config).then((res: AxiosResponse) => {
    return transformResponseData(res)
  })
}

// 处理config方法
function processConfig(config: AxiosRequestConfig) {
  config.url = transformUrl(config)
  // 此处必定是先处理headers 然后处理data,因为data为对象时需要设置headers的content-type
  config.headers = transformHeaders(config)
  config.data = transformBody(config)
}

// 转换URL
function transformUrl(config: AxiosRequestConfig) {
  const { url, params } = config
  return buildURL(url!, params)
}

// 转换data
function transformBody(config: AxiosRequestConfig) {
  const { data } = config
  return transformRequest(data)
}

// 转换headers
function transformHeaders(config: AxiosRequestConfig) {
  // 此处需要传入默认值
  const { headers = {}, data } = config
  return processHeaders(headers, data)
}

// 转换响应数据
function transformResponseData(res: AxiosResponse): AxiosResponse {
  res.data = transformResponse(res.data)
  return res
}
